package com.keepc.licence.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.keepc.licence.util.LicenseVerify;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * 许可证检查拦截器，用于在处理HTTP请求之前验证许可证的有效性。
 * 如果许可证无效，将阻止请求的进一步处理，并返回相应的错误信息。
 */
@Slf4j
@Component
public class LicenseCheckInterceptor implements HandlerInterceptor {

    /**
     * 在请求处理之前进行拦截，验证许可证是否有效。
     * 
     * @param request  HttpServletRequest对象，代表客户端的HTTP请求
     * @param response HttpServletResponse对象，用于向客户端发送响应
     * @param handler  将要处理请求的处理器对象
     * @return 如果许可证验证成功，返回true，允许请求继续处理；否则返回false，阻止请求的进一步处理
     * @throws Exception 可能抛出的异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        log.info("进入拦截器，验证证书可使用性");

        LicenseVerify licenseVerify = new LicenseVerify();

        // 校验证书是否有效
        boolean verifyResult = licenseVerify.verify();

        if (verifyResult) {
            log.info("验证成功，证书可用");
            return true;
        } else {
            log.info("验证失败，证书无效");
            // 设置响应类型为JSON，编码方式为utf-8，并构建许可证无效的响应内容
            response.setContentType("application/json;charset=utf-8");
            Map<String, String> result = new HashMap<>(1);
            result.put("code", "401");
            result.put("msg", "您的证书无效，请核查服务器是否取得授权或重新申请证书！");

            // 将响应内容转换为JSON字符串，并写入响应体中
            ObjectMapper objectMapper = new ObjectMapper();
            String resJson = objectMapper.writeValueAsString(result);
            response.getWriter().write(resJson);

            return false;
        }
    }

}